from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client, get_tracker_conf
from django.conf import settings


class My_storage(Storage):

    def __init__(self, tracker_conf=None, base_url=None):
        if tracker_conf is None:
            self.tracker_conf = settings.TRACKER_CONF
        if base_url is None:
            self.base_url = settings.BASE_URL

    def _open(self, name, mode='rb'):
        '''打开文件时使用'''
        pass

    def _save(self, name, content):
        '''存储文件时使用'''
        # name:上传文件的名字
        # content:上传文件的内容

        client_conf = get_tracker_conf(self.tracker_conf)
        client = Fdfs_client(client_conf)
        # 按照文件内容上传文件
        res = client.upload_by_buffer(content.read())

        # 返回的字典：
        # dict
        # {
        #     'Group name': group_name,
        #     'Remote file_id': remote_file_id,
        #     'Status': 'Upload successed.',
        #     'Local file name': '',
        #     'Uploaded size': upload_size,
        #     'Storage IP': storage_ip
        # }
        if res['Status'] != 'Upload successed.':
            raise Exception('文件上传失败')

        file_name = res.get('Remote file_id')
        # 返回fdfs返回的文件id   这他妈是bytes类型的，需要转换成字符串
        return file_name.decode()

    def exists(self, name):
        # 本身django会判断文件名能不能用 如果已经存在就会返回false 但是在我们的fdfs里面不存在名字冲突的可能性，所以直接返回FALSE
        return False

    def url(self, name):
        # 在管理页面返回name name默认为保存在fdfs里后返回的文件名，要去到此文件我们要前面加入nginx，所以这里加上nginx
        return self.base_url + name
